# RVC Controller SW — Domain Model

| 항목 | 내용 |
|------|------|
| 문서 번호 | RVC-DM-001 |
| 버전 | v1.0 |
| 작성일 | 2026-05-19 |
| 작성자 | OOAD Team |
| 상태 | 초안 (Draft) |

---

## 변경 이력 (Change History)

| 버전 | 날짜 | 변경 내용 | 작성자 |
|------|------|-----------|--------|
| v1.0 | 2026-05-19 | 최초 작성 — FR/UC 기반 도메인 개념 클래스 도출 | OOAD Team |
| v1.1 | 2026-05-19 | PNG 이미지 삽입 | OOAD Team |

---

## 1. Domain Model (PlantUML)

> **렌더링 방법:** VS Code PlantUML 확장(Alt+D) 또는 [plantuml.com](https://www.plantuml.com/plantuml/uml/)

```plantuml
@startuml RVC_DomainModel

skinparam class {
  BackgroundColor #FFFDE7
  BorderColor #5D4037
  HeaderBackgroundColor #FFE082
  FontSize 11
}
skinparam enum {
  BackgroundColor #E8F5E9
  BorderColor #2E7D32
  FontSize 10
}
skinparam arrow {
  Color #424242
}
skinparam note {
  BackgroundColor #E3F2FD
  BorderColor #1565C0
}

title RVC Controller SW — Domain Model

' ── Enumerations ────────────────────────────────────────
enum RVCState {
  CLEANING
  STOPPED
  TURNING
  REVERSING
}

enum Direction {
  FORWARD
  BACKWARD
  LEFT
  RIGHT
}

enum PowerLevel {
  NORMAL
  BOOSTED
}

enum SensorStatus {
  ACTIVE
  ERROR
}

enum SensorPosition {
  FRONT
  LEFT
  RIGHT
}

' ── Domain Classes ───────────────────────────────────────
class RVC {
  - state : RVCState
}

class Controller {
  - pollingInterval : int
}

class MovementUnit {
  - currentDirection : Direction
  - speed            : float
}

class CleaningUnit {
  - powerLevel    : PowerLevel
  - boostDuration : int
  - isActive      : boolean
}

abstract class Sensor {
  - sensorId : String
  - status   : SensorStatus
}

class ObstacleSensor {
  - position         : SensorPosition
  - obstacleDetected : boolean
}

class DustSensor {
  - dustLevel    : float
  - dustDetected : boolean
}

class Obstacle {
  - detectedAt : SensorPosition
}

class Dust {
  - concentration : float
}

' ── Relationships ────────────────────────────────────────

' Composition: RVC는 핵심 단위들을 소유
RVC "1" *-down- "1" Controller  : contains >
RVC "1" *-down- "1" MovementUnit  : contains >
RVC "1" *-down- "1" CleaningUnit  : contains >

' Controller는 Sensor들을 감시
Controller "1" o-right- "1..*" Sensor : monitors >

' Controller는 MovementUnit / CleaningUnit에 명령
Controller "1" -down-> "1" MovementUnit  : commands >
Controller "1" -down-> "1" CleaningUnit  : commands >

' Sensor 상속 계층
Sensor <|-down- ObstacleSensor
Sensor <|-down- DustSensor

' 센서 ↔ 환경 객체 감지 관계
ObstacleSensor "1" ..> "0..1" Obstacle : detects >
DustSensor     "1" ..> "0..1" Dust     : detects >

' Enum 연결
RVC          ..  RVCState
MovementUnit ..  Direction
CleaningUnit ..  PowerLevel
Sensor       ..  SensorStatus
ObstacleSensor .. SensorPosition
Obstacle       .. SensorPosition

' ── Notes ───────────────────────────────────────────────
note right of ObstacleSensor
  FRONT / LEFT / RIGHT 세 인스턴스가
  각각 해당 방향의 장애물을 감지
end note

note right of CleaningUnit
  boostDuration 경과 후
  PowerLevel이 NORMAL로 자동 복귀
end note

note bottom of Controller
  pollingInterval ≤ 100ms (NFR-PER-03)
  SensorStatus == ERROR → RVC.state = STOPPED
end note

@enduml
```

![Domain Model](diagrams/domain_model.png)

---

## 2. 도메인 클래스 정의

| 클래스 | 유형 | 설명 |
|--------|------|------|
| **RVC** | 개념 클래스 | 로봇 청소기 본체. 전체 시스템의 루트 객체 |
| **Controller** | 개념 클래스 | 센서 데이터를 읽고 MovementUnit·CleaningUnit에 명령을 내리는 제어 중심 |
| **MovementUnit** | 개념 클래스 | 이동 방향·속도를 관리하는 이동 제어 단위 |
| **CleaningUnit** | 개념 클래스 | 청소 파워 수준과 부스트 지속시간을 관리하는 청소 단위 |
| **Sensor** | 추상 클래스 | 모든 센서의 공통 속성(ID, 상태)을 정의하는 추상 개념 |
| **ObstacleSensor** | 구체 클래스 | 특정 방향(Front/Left/Right)의 장애물 유무를 감지 |
| **DustSensor** | 구체 클래스 | 먼지 농도를 측정하여 감지 여부를 판단 |
| **Obstacle** | 환경 개념 | 센서가 감지한 실세계 장애물 |
| **Dust** | 환경 개념 | 먼지 센서가 감지한 이물질 |

---

## 3. 관계 정의

| 관계 | From | To | 다중성 | 의미 |
|------|------|----|--------|------|
| Composition | RVC | Controller | 1 : 1 | RVC는 하나의 Controller를 소유 |
| Composition | RVC | MovementUnit | 1 : 1 | RVC는 하나의 이동 단위를 소유 |
| Composition | RVC | CleaningUnit | 1 : 1 | RVC는 하나의 청소 단위를 소유 |
| Aggregation | Controller | Sensor | 1 : 1..* | Controller는 하나 이상의 센서를 감시 |
| Association | Controller | MovementUnit | 1 : 1 | Controller가 이동 명령을 전달 |
| Association | Controller | CleaningUnit | 1 : 1 | Controller가 청소 명령을 전달 |
| Generalization | Sensor | ObstacleSensor | — | ObstacleSensor는 Sensor의 하위 개념 |
| Generalization | Sensor | DustSensor | — | DustSensor는 Sensor의 하위 개념 |
| Dependency | ObstacleSensor | Obstacle | 1 : 0..1 | 장애물을 감지(있을 수도 없을 수도) |
| Dependency | DustSensor | Dust | 1 : 0..1 | 먼지를 감지(있을 수도 없을 수도) |

---

## 4. 열거형(Enum) 정의

| Enum | 값 | 사용 클래스 |
|------|----|------------|
| **RVCState** | CLEANING, STOPPED, TURNING, REVERSING | RVC |
| **Direction** | FORWARD, BACKWARD, LEFT, RIGHT | MovementUnit, Obstacle |
| **PowerLevel** | NORMAL, BOOSTED | CleaningUnit |
| **SensorStatus** | ACTIVE, ERROR | Sensor |
| **SensorPosition** | FRONT, LEFT, RIGHT | ObstacleSensor, Obstacle |

---

## 5. 주요 도메인 규칙 (Domain Rules)

| 규칙 ID | 설명 | 관련 FR |
|---------|------|---------|
| DR-01 | ObstacleSensor는 FRONT / LEFT / RIGHT 총 3개 인스턴스로 존재 | FR-SEN-01~03 |
| DR-02 | Controller의 폴링 주기는 100ms 이하 | NFR-PER-03 |
| DR-03 | SensorStatus가 ERROR이면 RVCState는 STOPPED로 강제 전환 | NFR-REL-01 |
| DR-04 | CleaningUnit.powerLevel이 BOOSTED로 전환 후 boostDuration 경과 시 NORMAL로 자동 복귀 | FR-CLN-02~03 |
| DR-05 | RVCState가 STOPPED일 때도 CleaningUnit.isActive는 true 유지 | FR-CLN-04 |
| DR-06 | FRONT·LEFT·RIGHT 모두 Obstacle 감지 시 RVCState는 REVERSING으로 전환 | FR-MOV-05 |
